<!DOCTYPE html>
<html>
  <head>
    <title>
      Test Event Constructors
    </title>
    <script src="../resources/testharness.js"></script>
    <script src="../resources/testharnessreport.js"></script>
    <script src="resources/audit-util.js"></script>
    <script src="resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let audit = Audit.createTaskRunner();

      audit.define('offline-constructor', (task, should) => {
        should(function() {
          new OfflineAudioCompletionEvent();
        }, 'new OfflineAudioCompletionEvent()').throw(TypeError);

        should(function() {
          new OfflineAudioCompletionEvent('complete');
        }, 'new OfflineAudioCompletionEvent("complete")').throw(TypeError);

        should(
            function() {
              new OfflineAudioCompletionEvent('complete', {});
            },
            'new OfflineAudioCompletionEvent("complete", {})')
            .throw(TypeError);

        should(
            function() {
              new OfflineAudioCompletionEvent('complete', {foo: 42});
            },
            'new OfflineAudioCompletionEvent("complete", {foo: 42})')
            .throw(TypeError);

        let context = new OfflineAudioContext(1, 100, 48000);
        let buffer = new AudioBuffer(context, {length: 42});

        should(
            function() {
              new OfflineAudioCompletionEvent(
                  'complete', {renderedBuffer: buffer});
            },
            'new OfflineAudioCompletionEvent("complete", {renderedBuffer: buffer})')
            .notThrow();

        task.done();
      });

      audit.define('offline-event', (task, should) => {
        // Only need the context for constructing the AudioBuffers for the
        // tests.
        let context = new OfflineAudioContext(1, 100, 48000);

        // Just an arbitrary AudioBuffer.
        let buffer = new AudioBuffer(context, {length: 10});

        let event;
        should(function() {
          event =
              new OfflineAudioCompletionEvent('foo', {renderedBuffer: buffer});
        }, 'new OfflineAudioCompletionEvent()').notThrow();

        should(event.renderedBuffer == buffer, 'event.renderedBuffer == buffer')
            .beEqualTo(true);

        task.done();
      });

      audit.define('audio-processing', (task, should) => {
        // Only need the context for constructing the AudioBuffers for the
        // tests.
        let context = new OfflineAudioContext(1, 100, 48000);

        // Fairly arbitrary buffers and time
        let input = new AudioBuffer(context, {length: 10});
        let output = new AudioBuffer(context, {length: 20});
        let time = Math.PI;

        // Verify required arguments.
        should(function() {
          new AudioProcessingEvent();
        }, 'new AudioProcessingEvent()').throw(TypeError);

        should(function() {
          new AudioProcessingEvent('proc');
        }, 'new AudioProcessingEvent("proc")').throw(TypeError);

        should(function() {
          new AudioProcessingEvent('proc', {foo: 99});
        }, 'new AudioProcessingEvent("proc", {foo: 99})').throw(TypeError);

        should(
            function() {
              new AudioProcessingEvent(
                  'proc', {inputBuffer: input, outputBuffer: output});
            },
            'new AudioProcessingEvent("proc", ' +
                '{inputBuffer: input, outputBuffer: output})')
            .throw(TypeError);

        should(
            function() {
              new AudioProcessingEvent(
                  'proc', {inputBuffer: input, playbackTime: time});
            },
            'new AudioProcessingEvent("proc", ' +
                '{inputBuffer: input, playbackTime: time})')
            .throw(TypeError);

        should(
            function() {
              new AudioProcessingEvent(
                  'proc', {outputBuffer: output, playbackTime: time});
            },
            'new AudioProcessingEvent("proc", ' +
                '{outputBuffer: output, playbackTime: time})')
            .throw(TypeError);


        // Finally test valid call
        let event;
        should(
            function() {
              event = new AudioProcessingEvent('proc', {
                inputBuffer: input,
                outputBuffer: output,
                playbackTime: time
              });
            },
            'new AudioProcessingEvent("proc", ' +
                '{inputBuffer: input, outputBuffer: output, playbackTime: time})')
            .notThrow();

        should(event.playbackTime, 'event.playbackTime').beEqualTo(time);

        should(event.inputBuffer == input, 'event.inputBuffer == input')
            .beEqualTo(true);

        should(event.outputBuffer == output, 'event.outputBuffer == output')
            .beEqualTo(true);

        task.done();
      });

      audit.run();
    </script>
  </body>
</html>
